home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / AMRA2.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  63KB  |  1,928 lines

  1. UNIT AMRA2;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ File areamanager # RaFileman                  Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, Dos, OpWindow, OpPick,
  16.      AMList, OproUtil;
  17.  
  18. TYPE
  19.   FILESHDRRECORD = RECORD
  20.     NAME           : STRING [12];
  21.     SIZE,
  22.     CRC32          : LONGINT;
  23.     UPLOADER       : STRING [35];
  24.     UPLOADDATE,
  25.     FILEDATE,
  26.     LASTDL         : LONGINT;
  27.     TIMESDL        : WORD;
  28.     ATTRIB         : BYTE;
  29.     PASSWORD       : STRING [15];
  30.     KEYWORD        : ARRAY [1..5] OF
  31.     STRING [15];
  32.     COST           : WORD;
  33.     LONGDESCPTR    : LONGINT;
  34.     FREESPACE      : ARRAY [1..20] OF
  35.     BYTE;
  36.   END;
  37.  
  38. { ATTRIB - BIT 0 : DELETED
  39.                1 : UNLISTED
  40.                2 : FREE (DON'T ADJUST RATIO) - DOES NOT AFFECT "COST"
  41.                3 : NOT AVAILABLE (DON'T ALLOW DOWNLOADS)
  42.                4 : LOCKED (NO KILL)
  43.                5 : MISSING/OFFLINE
  44.                6 : NO TIME RESTRICTIONS - ALWAYS ALLOW DL }
  45.  
  46. { Freespace - BIT  1 : File Exist
  47.                   20 : Selected
  48. ( These Bit are zeroed then file is written to disk again }
  49.  
  50.  
  51.   FILESIDXRECORD = RECORD
  52.     NAME           : STRING [12];
  53.     UPLOADDATE     : LONGINT;
  54.     KEYWORDCRC     : ARRAY [1..5] OF
  55.     LONGINT;
  56.     LONGDESCPTR    : LONGINT;
  57.   END;
  58.  
  59.  
  60. CONST
  61.   {    FALGS     }
  62.   RaDELETED       = $0001;
  63.   RaUNLISTED      = $0002;
  64.   RaFREE          = $0004;
  65.   RaNOTAVAILABLE  = $0008;
  66.   RaLOCKED        = $0010;
  67.   RaMISSING       = $0020;
  68.   RaTIME          = $0040;
  69.  
  70. TYPE
  71.   FileStr           = STRING [12]; {Room for just a filename}
  72.   RARec = RECORD
  73.     SIZE           : LONGINT;    {Size of file}
  74.     NAME           : FileStr;    {Name and extension of file}
  75.     ATTRIB         : BYTE;       {File attribute}
  76.     LONGDESCPTR    : LONGINT;
  77.     FILEDATE,
  78.     UPLOADDATE,
  79.     LASTDL         : LONGINT;
  80.     COST,
  81.     TIMESDL        : WORD;
  82.   END;
  83.  
  84.   RARecArray       = ARRAY [1..2000] OF ^FILESHDRRECORD;
  85.  
  86.   RaList = object(Alist)
  87.     RarPtr        : RARecArray;
  88.     HDRREC        : FILESHDRRECORD;
  89.     Rafiles,
  90.     Ralines       : WORD;
  91.     RaSelected    : WORD;
  92.     MAXLINES,
  93.     Rasize        : LONGINT;
  94.     RaSelSize     : LONGINT;
  95.     RaAreanumber  : WORD;
  96.     RamoveAreanumber : WORD;
  97.     RaMoveAreaPath   : Pathstr;
  98.     RaMask        : fileStr;
  99.     RaAreaname    : STRING;
  100.     RaTEXTFILE    : TbufTextfile;
  101.     RaDescWin     : WindowPtr;
  102.     RaDesc        : ARRAY [1..500] OF CHAR;
  103.     Desclines     : ARRAY [1..4] OF STRING [80];
  104.  
  105.     constructor Init;
  106.     DESTRUCTOR Done; virtual;
  107.     FUNCTION  RaLoadfiles : BOOLEAN;
  108.     PROCEDURE RaWritefiles;
  109.     PROCEDURE RaDelocatefiles;
  110.     PROCEDURE Writedescription_To_window (LONGDESCPTR : LONGINT);
  111.     PROCEDURE ReadDescLine (VAR DESC : STRING; NUM : LONGINT);
  112.     PROCEDURE ReadLnFromMem (VAR DESC : STRING; NUM : LONGINT);
  113.     PROCEDURE Writeln2Mem (DESC : STRING; NUM : LONGINT);
  114.     PROCEDURE Editdescline;
  115.     PROCEDURE EditDescField;
  116.     PROCEDURE EDITATTRIBUTES;
  117.     PROCEDURE Insertline (NUM : WORD;  Ask : BOOLEAN);
  118.     PROCEDURE DeleteOneLine (Ask, Del : BOOLEAN; NUM : WORD);
  119.     PROCEDURE Deleteline (Ask : BOOLEAN);
  120.     PROCEDURE TouchFile;
  121.     PROCEDURE Moveline;
  122.     PROCEDURE MoveFileInSameArea;
  123.     PROCEDURE RenameLine;
  124.     PROCEDURE TouchAllFiles;
  125.     FUNCTION  AdoptOrphans (Silent, EnterUploader : BOOLEAN) : BOOLEAN;
  126.     PROCEDURE ResetDownloadCounters;
  127.     PROCEDURE GlobalCommands;
  128.     PROCEDURE RaQuickSort (First, Last : WORD);
  129.     PROCEDURE RaSortFiles;
  130.     PROCEDURE TotalHeader;
  131.     PROCEDURE SelectedHeader;
  132.     PROCEDURE RaClearSelected;
  133.     PROCEDURE SendFilesToNode;
  134.     PROCEDURE HatchFiles;
  135.     PROCEDURE Centerline;
  136.     PROCEDURE Joinlines;
  137.     PROCEDURE ViewGIF;
  138.     PROCEDURE ImportDescription;
  139.     Procedure Reverse_Select;
  140.     Procedure MenuSelect(MarkLine : Boolean);
  141.     PROCEDURE ItemString (Item : WORD; Mode : pkMode;
  142.                          VAR IType : pkItemType;VAR IString : STRING); virtual;
  143.     PROCEDURE Premove; virtual;
  144.     PROCEDURE AreaManagerMain;
  145.   END;
  146.  
  147. IMPLEMENTATION
  148.  
  149. USES OpCrt, OpDos, OpInline, OpKey, OpDate, OpString, OpRoot, OpCmd, OpFrame,
  150.      OpField, OpEdit, OpMemo, OpEntry,
  151.      Tick , AreaMan, AMFBBS, OutUtil, ArcView, NodeList, Input, Display, NetFile,
  152.      AreaMisc, MailUtil, FileUtil, StrUtil, Util, Resource,
  153.      Keyboard, PoPTypes, Globals;
  154.  
  155.   PROCEDURE RaAreaManagerKbdStatProc (KbdFlags : BYTE);
  156.     far;
  157.   VAR
  158.     s, ss : S80;
  159.   BEGIN
  160.     s := '';
  161.     ss := '';
  162.     CASE KbdFlags OF
  163.       0 : BEGIN
  164.         s := 'F1=Help         F2=Delete line  F3=Edit descr.  F4=Move/Copy    F5=Rename File';
  165.         ss := 'F6=Touch File   F7=Insert line  F8=Sort files   F9=View Archive F0=Global cmds';
  166.       END;
  167.       2, 1 : BEGIN
  168.         s := 'F1=Send files   F2=Hatch tick   F3=Center line  F4=Join lines';
  169.         ss := '                                                F9=View Picture F0=Edit Attrib';
  170.       END;
  171.       8 : Begin
  172.         s := '                                F3=Import DIZ';
  173.         ss := '                                 ';
  174.  
  175.       END;
  176.     END;
  177.     WITH Cfg.Color [2] DO
  178.          BEGIN
  179.            FastText (CPad (s, 80), ScreenHeight - 1, 1);
  180.            FastText (CPad (ss, 80), ScreenHeight, 1);
  181.          END;
  182.   END;
  183.  
  184.   PROCEDURE RaFindFile(A : Alistptr);
  185.   VAR
  186.     Z, i, j, k : INTEGER;
  187.     s : STRING;
  188.     DS, Dss : STRING;
  189.     Conf,
  190.     Found : BOOLEAN;
  191.     Temp2 : windowPtr;
  192.     THDRFILE : TNetFile;
  193.     THDRREC : FILESHDRRECORD;
  194.     Textfile : TNetFile;
  195.   BEGIN
  196.     IF InputString (5, 8, 70, 50, 3, 'Search', 'File : ', s) THEN
  197.       BEGIN
  198.         s := StUpCase (s);
  199.         FOR i := 1 TO Numarea DO
  200.             BEGIN
  201.               IF GotEsc THEN
  202.                 Break;
  203.               A^.CurrentArea := i;
  204.               THDRFILE.Open(FDBPATH + 'HDR\fdb' + Long2str (i) + '.HDR', SIZEOF (THDRREC), FALSE);
  205.               k := THDRFILE.FILESIZE;
  206.               FOR j := 1 TO k DO
  207.                   BEGIN
  208.                     Found := FALSE;
  209.                     THDRFILE.Read(THDRREC, NoKeep, Wait);
  210.                     IF POS (s, StUpCase (THDRREC.NAME) ) <> 0 THEN
  211.                       BEGIN
  212.                         Dss := '';
  213.                         Textfile.Open(FDBPATH + 'TXT\fdb' + Long2str (i) + '.TXT', 1, FALSE);
  214.                         Textfile.SEEK(THDRREC.LONGDESCPTR );
  215.                         IF Textfile.IORESULT = 0 THEN
  216.                         BEGIN
  217.                           FILLCHAR (DS, SIZEOF (DS), #0);
  218.                           Textfile.BLOCKREAD (DS[1] , 80);
  219.                           Z := 1;
  220.                           WHILE NOT (DS [Z] = #0) DO
  221.                           BEGIN
  222.                             Dss := Dss + DS [Z];
  223.                             INC (Z);
  224.                           END;
  225.                         END;
  226.                         Textfile.Close;
  227.                         MyWin (Temp2, 3, 8, 78, 12, 4, 'Found...', FALSE);
  228.                         Temp2^.wFastWrite ('Area: (' + Area^ [i]^.tag^ + ') ' + Area^ [i]^.title^,
  229.                         1, 2, Cfg.Color [4] .HighlightColor);
  230.                         Temp2^.wFastWrite ('File: ' + THDRREC.NAME, 2, 2, Cfg.Color [4] .HighlightColor);
  231.                         Temp2^.wFastWrite ('Desc: ' + Dss, 3, 2, Cfg.Color [4] .HighlightColor);
  232.                         Conf := Confirm ('Continue search ?', 'N', 14);
  233.                         KillWindow (Temp2);
  234.                         IF NOT Conf THEN
  235.                         BEGIN
  236.                           Found := TRUE;
  237.                           THDRFILE.Close;
  238.                           Break;
  239.                         END;
  240.                       END;
  241.                   END;
  242.               IF Found THEN
  243.               BEGIN
  244.                 StuffKey (Enter);
  245.                 A^.TopArea := i - 1;
  246.                 A^.AreaLine := 1;
  247.                 A^.StartLine := j - 1;
  248.                 THDRFILE.Close;
  249.                 Break;
  250.               END;
  251.             END;
  252.         THDRFILE.Close;
  253.       END;
  254.   END;
  255.  
  256.   {$F+}
  257.   FUNCTION RaMultipleChoiceCommand (VAR Cmd : WORD;
  258.     P : PickListPtr) : BOOLEAN;
  259.   VAR
  260.     HelpTopic : WORD;
  261.     SavePkFlags : WORD;
  262.  
  263.   BEGIN
  264.     RaMultipleChoiceCommand := FALSE;
  265.     WITH P^ DO
  266.          BEGIN
  267.            CASE GETLASTKEY OF
  268.                 F3, F2, Del, F4, F5, F6, F7, INS, F8, F9, F10,
  269.                 ShF1, ShF2, ShF3, ShF4, ShF9, ShF10,
  270.                 AltF3,
  271.                 Star, Plus, Minus,PadStar, PadPlus, PadMinus : RaMultipleChoiceCommand := TRUE;
  272.            ELSE
  273.                 CASE Cmd OF
  274.                      ccNone : pkResetSearchStr;   {Invalid keystroke}
  275.                      ccChar :                  {Alphanumeric, possibly used for searching}
  276.                      IF FlagIsSet (pkSecFlags, pkEvaluating) OR OKToChangeChoice THEN
  277.                        RaMultipleChoiceCommand := ItemSearch;
  278.                      ccUp, ccDown,             {Cursor movements}
  279.                      ccPageUp, ccPageDn,
  280.                      ccHome, ccEnd,
  281.                      ccLeft, ccRight,
  282.                      ccNextXref, ccPrevXref,
  283.                      ccTopOfFile, ccEndOfFile :
  284.                      IF FlagIsSet (pkSecFlags, pkEvaluating) OR OKToChangeChoice THEN
  285.                        BEGIN
  286.                          pkResetSearchStr;
  287.                          RaMultipleChoiceCommand := pkProcessCursorCommand (Cmd);
  288.                        END;
  289.                      {$IFDEF UseMouse}
  290.                      ccMouseSel,               {Select with mouse, mouse left button up}
  291.                      ccMouseDown,              {Mouse left button down}
  292.                      ccMouseAuto  :            {Mouse moved with left down or autorepeat}
  293.                      IF FlagIsSet (pkSecFlags, pkEvaluating) OR OKToChangeChoice THEN
  294.                        BEGIN
  295.                          pkResetSearchStr;
  296.                          RaMultipleChoiceCommand := pkProcessMouseCommand (Cmd, TRUE);
  297.                        END;
  298.                      {$ENDIF}
  299.                      ccHelp :                  {Help}
  300.                      BEGIN
  301.                        IF FlagIsSet (pkFlags, pkUseItemForTopic) THEN
  302.                          HelpTopic := pkChoice
  303.                        ELSE
  304.                           HelpTopic := wHelpIndex;
  305.                        SavePkFlags := pkFlags;
  306.                        SetFlag (pkFlags, pkDrawActive);
  307.                        RequestHelp (HelpTopic);
  308.                        pkFlags := SavePkFlags;
  309.                      END;
  310.                      CCins, CCdel, ccSelect :                {Select}
  311.                      IF NOT IsSemiProtected (pkChoice) THEN
  312.                        RaMultipleChoiceCommand := TRUE;
  313.                      {User exit commands}
  314.                      ccQuit, ccUser0..$FFFF : RaMultipleChoiceCommand := TRUE;
  315.                 ELSE
  316.                      IF (Cmd <= 255) AND (GetExitCommandPtr <> NIL) THEN
  317.                        {Possibly a special exit command defined by a derived object}
  318.                        IF (Cmd IN GetExitCommandPtr^) THEN
  319.                          RaMultipleChoiceCommand := TRUE
  320.                        ELSE
  321.                           pkResetSearchStr;
  322.                 END;
  323.            END;
  324.     END;
  325.   END;
  326.  
  327.  
  328.  
  329.   CONSTRUCTOR RaList.Init;
  330.   BEGIN
  331.     InitAreaManager;
  332.     Initabstract (2, 4, 79, ScreenHeight - 9, Cfg.Color [2],   {ColorSet to use}
  333.                    DefWindowOptions + wBordered, {Window options}
  334.                    80,                {Column width per item}
  335.                    60000,             {Number of picklist items}
  336.                    PickVertical,      {Orientation procedure}
  337.                    SingleChoice);
  338.     pkSearcher := PickCharSearch;
  339.     pkOptionsOn (pkProcessZero);
  340.     Filefinder := RaFindFile;
  341.     WITH Cfg.Color [2] DO
  342.     BEGIN
  343.       SetPickAttr (pkalternate, FALSE, FieldColor, FieldMONO);
  344.       SetPickAttr (pkalternate, TRUE, SelFieldColor, SelFieldMono);
  345.     END;
  346.     ChangeNumItems (0);
  347.     Fdbpath := Addbackslash(FdbPath);
  348.     RaSelected  := 0;
  349.     RaSelSize   := 0;
  350.     RaMask := '*.*';
  351.     PkCommand := RaMultipleChoiceCommand;
  352.     wFrame.AdjustFrame (1, 2, 80, ScreenHeight - 8);
  353.     wFrame.AddHeader ('', heTC);
  354.     wFrame.AddHeader ('', HEBL);
  355.     wFrame.AddHeader ('', HEBR);
  356.     wFrame.AddCUSTOMheader (PAD ('┌── Name ──┐      Size     Date      DL#     Cost   Last DL   UPdate    Flags', 78),
  357.                             frTL, 1, 1, Cfg.Color [2] .HighlightColor, Cfg.Color [2] .HighlightMono);
  358.     MyWin (RaDescWin, 1, ScreenHeight - 7, 80, ScreenHeight - 3, 2, ' Description ', FALSE);
  359.     MAXLINES := (MEMAVAIL - 30 * 1024) DIV 200;
  360.   END;
  361.  
  362.   destructor RaList.Done;
  363.   BEGIN
  364.     ERASEHidden;
  365.     KillWindow (RaDescWin);
  366.     PickList.Done;
  367.     FinishAreaManager;
  368.   END;
  369.  
  370. PROCEDURE RaList.ReadDescLine (VAR DESC : STRING; NUM : LONGINT);
  371. VAR
  372.   C : CHAR;
  373.   ss : STRING;
  374. BEGIN
  375.   ss := '';
  376.   IF NUM > - 1 THEN
  377.   WITH RaTEXTFILE DO
  378.   BEGIN
  379.     SEEK (NUM);
  380.     READ (C, 1);
  381.     WHILE (NOT EOF) AND (C <> #0) AND (LENGTH (ss) < 79) DO
  382.     BEGIN
  383.       ss := ss + C;
  384.       READ (C, 1);
  385.     END;
  386.   END;
  387.   DESC := PAD (ss, 80);
  388. END;
  389.  
  390. PROCEDURE RaList.ReadLnFromMem (VAR DESC : STRING; NUM : LONGINT);
  391. BEGIN
  392.   DESC := '';
  393.   DESC [0] := CHAR (80);
  394.   MOVE (RarPtr [NUM]^.SIZE, DESC [1], 80);
  395.   DESC := Trimtrail (DESC);
  396. END;
  397.  
  398. PROCEDURE RaList.Writeln2Mem (DESC : STRING;
  399.   NUM : LONGINT);
  400. BEGIN
  401.   DESC := PAD (DESC, 80);
  402.   MOVE (DESC [1], RarPtr [NUM]^.SIZE, 80);
  403. END;
  404.  
  405.  
  406. PROCEDURE RaList.Editdescline;
  407. VAR
  408.   A : BYTE;
  409.   C : CHAR;
  410.   ss : STRING;
  411. BEGIN
  412.   ReadLnFromMem (ss, pkChoice);
  413.   IF InputString (3, 7, 79, 65, 3, 'Edit description', 'Desc : ', ss) THEN
  414.   BEGIN
  415.     IF ss <> '' THEN
  416.     BEGIN
  417.       C := #0;
  418.       RarPtr [pkChoice]^.LONGDESCPTR := RaTEXTFILE.getsize;
  419.       IF RarPtr [pkChoice]^.LONGDESCPTR > 0 THEN
  420.       BEGIN
  421.         RaTEXTFILE.SEEK (RarPtr [pkChoice]^.LONGDESCPTR - 1);
  422.         RaTEXTFILE.WriteNoln (#0);
  423.       END;
  424.       RaTEXTFILE.WriteNoln (ss + #0);
  425.     END ELSE
  426.       RarPtr [pkChoice]^.LONGDESCPTR := - 1;
  427.     RaTEXTFILE.FLUSH;
  428.     Writeln2Mem (ss, pkChoice);
  429.   END;
  430. END;
  431.  
  432.  
  433. PROCEDURE RaList.EditDescField;
  434. VAR
  435.   FSize : LONGINT;
  436.   F : TbufTextfile;
  437.   TempFilename : Pathstr;
  438.   editdesc : MemoFile;
  439.   C : CHAR;
  440.  
  441. BEGIN
  442.   IF RarPtr [pkChoice]^.LONGDESCPTR > - 1 THEN
  443.   BEGIN
  444.     RaTEXTFILE.SEEK (RarPtr [pkChoice]^.LONGDESCPTR);
  445.     TempFilename := UniqueName (FDBPATH + 'TXT\TMPDESC.TMP');
  446.     F.initCreate (TempFilename, SOpenWrite, 2048);
  447.     RaTEXTFILE.READ (C, 1);
  448.     WHILE NOT RaTEXTFILE.EOF AND NOT (C = #0) DO
  449.     BEGIN
  450.       F.WRITE (C, 1);
  451.       RaTEXTFILE.READ (C, 1);
  452.     END;
  453.     F.Done;
  454.   END;
  455.   WITH editdesc DO
  456.        BEGIN
  457.          InitCustomAndAlloc (9, 8, 72, 18,               {Window coordinates}
  458.          Cfg.Color [3],            {ColorSet}
  459.          DefWindowOptions OR wBordered, {Window options}
  460.          4096);                    {Buffer size}
  461.          ReadFile (TempFilename, FSize);
  462.          {add a header centered at the top of the frame}
  463.          wFrame.AddHeader (' Edit description ', heTC);
  464.          wFrame.AddShadow (shBR, shSeeThru);
  465.          {change the color for control characters}
  466.          SetCtrlAttr (Cfg.Color [3] .HighlightColor, Cfg.Color [3] .HighlightMono);
  467.          SetHelpIndex (15);
  468.          Process;
  469.          IF meOptionsAreOn (meModified) AND
  470.            Confirm ('Save Description ', 'Y', (ScreenHeight DIV 2) - 3) THEN
  471.            BEGIN
  472.              SaveFile;
  473.              F.initCreate (TempFilename, SOpenread, 2048);
  474.              RarPtr [pkChoice]^.LONGDESCPTR := RaTEXTFILE.getsize;
  475.              IF RarPtr [pkChoice]^.LONGDESCPTR > 0 THEN
  476.                BEGIN
  477.                  RaTEXTFILE.SEEK (RarPtr [pkChoice]^.LONGDESCPTR - 1);
  478.                  RaTEXTFILE.WriteNoln (#0);
  479.                END;
  480.              F.SEEK (0);
  481.              F.READ (C, 1);
  482.              WHILE NOT F.EOF AND NOT (C = #0) DO
  483.                    BEGIN
  484.                      RaTEXTFILE.WRITE (C, 1);
  485.                      F.READ (C, 1);
  486.                    END;
  487.              RaTEXTFILE.WriteNoln (#0);
  488.              F.Done;
  489.            END;
  490.          DeleteFile (TempFilename);
  491.          DeleteFile (COPY (TempFilename, 1, LENGTH (TempFilename) - 3) + 'BAK');
  492.          ERASE;
  493.          Done;
  494.        END;
  495. END;
  496.  
  497. VAR
  498.   FILENAME : STRING [12];
  499.   TEMPHDR : FILESHDRRECORD;
  500.  
  501. PROCEDURE RaList.EDITATTRIBUTES;
  502. CONST
  503.   idName                 = 0;
  504.   idDeleted              = idName + 1;
  505.   idFiledate             = idDeleted + 1;
  506.   idUnlisted             = idFiledate + 1;
  507.   idUploaddate           = idUnlisted + 1;
  508.   idFree                 = idUploaddate + 1;
  509.   idLastDL               = idFree + 1;
  510.   idMissing              = idLastDL + 1;
  511.   idUploader             = idMissing + 1;
  512.   idLocked               = idUploader + 1;
  513.   idPassword             = idLocked + 1;
  514.   idNotAvail             = idPassword + 1;
  515.   idNotime               = idNotAvail + 1;
  516.   idkeyword              = idNotime + 1;
  517.   idTimesDl              = idkeyword + 1;
  518.   idCost                 = idTimesDl + 1;
  519.   idDescription          = idCost + 1;
  520.  
  521.   {Help index constants}
  522. CONST
  523.   hiName                 = 1;
  524.   hiDeleted              = hiName + 1;
  525.   hiFiledate             = hiDeleted + 1;
  526.   hiUnlisted             = hiFiledate + 1;
  527.   hiUploaddate           = hiUnlisted + 1;
  528.   hiFree                 = hiUploaddate + 1;
  529.   hiLastDL               = hiFree + 1;
  530.   hiMissing              = hiLastDL + 1;
  531.   hiUploader             = hiMissing + 1;
  532.   hiLocked               = hiUploader + 1;
  533.   hiPassword             = hiLocked + 1;
  534.   hiNotAvail             = hiPassword + 1;
  535.   hiNotime               = hiNotAvail + 1;
  536.   hikeyword              = hiNotime + 1;
  537.   hiTimesDl              = hikeyword + 1;
  538.   hiCost                 = hiTimesDl + 1;
  539.   hiDescription          = hiCost + 1;
  540.  
  541.   EsDeleted              : BOOLEAN = FALSE;
  542.   EsUnlisted             : BOOLEAN = FALSE;
  543.   EsFree                 : BOOLEAN = FALSE;
  544.   EsMissing              : BOOLEAN = FALSE;
  545.   EsLocked               : BOOLEAN = FALSE;
  546.   EsNotAvail             : BOOLEAN = FALSE;
  547.   EsNotime               : BOOLEAN = FALSE;
  548.  
  549. VAR
  550.   AllDone : BOOLEAN;
  551.   TempAttr : BYTE;
  552.   ES     : EntryScreen;
  553.   HDRFILE : FILE;
  554.   TUPLOADDATE,
  555.   TFILEDATE,
  556.   TLASTDL         : DateTimeRec;
  557.  
  558. BEGIN
  559.   HDRREC := RarPtr [pkChoice]^;
  560.   EsDeleted := ByteFlagIsSet (HDRREC.ATTRIB, RaDELETED) ;
  561.   EsUnlisted := ByteFlagIsSet (HDRREC.ATTRIB, RaUNLISTED);
  562.   EsFree := ByteFlagIsSet (HDRREC.ATTRIB, RaFREE) ;
  563.   EsMissing := ByteFlagIsSet (HDRREC .ATTRIB, RaMISSING);
  564.   EsLocked := ByteFlagIsSet (HDRREC.ATTRIB, RaLOCKED);
  565.   EsNotAvail := ByteFlagIsSet (HDRREC.ATTRIB, RaNOTAVAILABLE);
  566.   EsNotime := ByteFlagIsSet (HDRREC.ATTRIB, RaTIME);
  567.  
  568.   PackedToDateTime (HDRREC.UPLOADDATE, TUPLOADDATE);
  569.   PackedToDateTime (HDRREC.FILEDATE, TFILEDATE);
  570.   PackedToDateTime (HDRREC.LASTDL, TLASTDL);
  571.   WITH ES DO
  572.   BEGIN
  573.     IF NOT InitCustom (2, 3, 79, 21, Cfg.Color [3], wBordered+wClear+wUserContents) THEN
  574.     BEGIN
  575.       EXIT;
  576.     END;
  577.     WITH HDRREC DO
  578.     BEGIN
  579.       FILENAME := NAME;
  580.       {idName:}
  581.       esFieldOptionsOn (efProtected);
  582.       AddStringField ('Filename      :', 2, 3, 'XXXXXXXXXXXX', 2, 19, 12, hiName, FILENAME);
  583.       esFieldOptionsOff (efProtected);
  584.  
  585.       {idFiledate:}
  586.       esFieldOptionsOn (efProtected);
  587.       esFieldOptionsOff (efTrimBlanks);
  588.       AddDateField ('FileDate      :', 3, 3, 'dd-mm-yy', 3, 19, hiFiledate, MinDate, MinDate, TFILEDATE.D);
  589.       esFieldOptionsOn (efTrimBlanks);
  590.       esFieldOptionsOff (efProtected);
  591.  
  592.       {idUploaddate:}
  593.       esFieldOptionsOff (efTrimBlanks);
  594.       AddDateField ('Upload date   :', 4, 3, 'dd-mm-yy', 4, 19, hiUploaddate, MinDate, MinDate, TUPLOADDATE.D);
  595.  
  596.       {idLastDL:}
  597.       AddDateField ('LastDl date   :', 5, 3, 'dd-mm-yy', 5, 19, hiLastDL, MinDate, MinDate, TLASTDL.D);
  598.       esFieldOptionsOn (efTrimBlanks);
  599.  
  600.       {idUploader:}
  601.       AddStringField ('Uploader name :', 6, 3, CharStr ('X', 60), 6, 19, 35, hiUploader, UPLOADER);
  602.  
  603.       {idPassword:}
  604.       AddStringField ('Password      :', 7, 3, 'XXXXXXXXXXXXXXX', 7, 19, 15, hiPassword, PASSWORD);
  605.  
  606.       {idkeyword:}
  607.       AddStringField ('Keyword 1 :', 9, 3, 'XXXXXXXXXXXXXXX', 9, 15, 15, hikeyword, HDRREC.KEYWORD [1]);
  608.  
  609.       {idkeyword:}
  610.       AddStringField ('Keyword 2 :', 10, 3, 'XXXXXXXXXXXXXXX', 10, 15, 15, hikeyword, HDRREC.KEYWORD [2]);
  611.  
  612.       {idkeyword:}
  613.       AddStringField ('Keyword 3 :', 11, 3, 'XXXXXXXXXXXXXXX', 11, 15, 15, hikeyword, HDRREC.KEYWORD [3]);
  614.  
  615.       {idkeyword:}
  616.       AddStringField ('Keyword 4 :', 12, 3, 'XXXXXXXXXXXXXXX', 12, 15, 15, hikeyword, HDRREC.KEYWORD [4]);
  617.  
  618.       {idkeyword:}
  619.       AddStringField ('Keyword 5 :', 13, 3, 'XXXXXXXXXXXXXXX', 13, 15, 15, hikeyword, HDRREC.KEYWORD [5]);
  620.  
  621.       {idTimesDl:}
  622.       AddWordField ('Times Dled :', 15, 3, '99999', 15, 16, hiTimesDl, 0, 65535, TIMESDL);
  623.  
  624.       {idCost:}
  625.       AddWordField ('Cost       :', 16, 3, '99999', 16, 16, hiCost, 0, 65535, COST);
  626.  
  627.       (*  {idDescription:}
  628.       AddNestedStringField ('Edit description <Enter> :', 17, 3, '', 17, 30, 1, hiDescription, Description);*)
  629.  
  630.       {idDeleted:}
  631.       esFieldOptionsOn (efClickExit);
  632.       AddYesNoField ('Deleted  :', 2, 59, 'Y', 2, 70, hiDeleted, EsDeleted);
  633.  
  634.       {idUnlisted:}
  635.       AddYesNoField ('Unlisted :', 3, 59, 'Y', 3, 70, hiUnlisted, EsUnlisted);
  636.  
  637.       {idFree:}
  638.       AddYesNoField ('Free     :', 4, 59, 'Y', 4, 70, hiFree, EsFree);
  639.  
  640.       {idMissing:}
  641.       AddYesNoField ('Missing  :', 5, 59, 'Y', 5, 70, hiMissing, EsMissing);
  642.  
  643.       {idLocked:}
  644.       AddYesNoField ('Locked   :', 6, 59, 'Y', 6, 70, hiLocked, EsLocked);
  645.  
  646.       {idNotAvail:}
  647.       AddYesNoField ('NotAvail :', 7, 59, 'Y', 7, 70, hiNotAvail, EsNotAvail);
  648.  
  649.       {idNotime:}
  650.       AddYesNoField ('NoTime   :', 8, 59, 'Y', 8, 70, hiNotime, EsNotime);
  651.       esFieldOptionsOff (efClickExit);
  652.     END;
  653.     AllDone := FALSE;
  654.     REPEAT
  655.       ES.Process;
  656. {     CASE ES.GetLastCommand OF
  657.         ccNested : EditDescField;
  658.       END;}
  659.     UNTIL ES.GetLastCommand IN [ccError, ccDone, ccQuit];
  660.     ES.ERASE;
  661.     ES.Done;
  662.     TempAttr := 0;
  663.     IF EsDeleted THEN SetByteFlag (TempAttr, RaDELETED);
  664.     IF EsUnlisted THEN SetByteFlag (TempAttr, RaUNLISTED) ;
  665.     IF EsFree  THEN SetByteFlag (TempAttr, RaFREE);
  666.     IF EsMissing  THEN SetByteFlag (TempAttr, RaMISSING);
  667.     IF EsLocked  THEN SetByteFlag (TempAttr, RaLOCKED);
  668.     IF EsNotAvail  THEN SetByteFlag (TempAttr, RaNOTAVAILABLE);
  669.     IF EsNotime  THEN SetByteFlag (TempAttr, RaTIME);
  670.     HDRREC.ATTRIB := TempAttr;
  671.  
  672.     DateTimeToPacked (TUPLOADDATE, HDRREC.UPLOADDATE);
  673.     DateTimeToPacked (TFILEDATE, HDRREC.FILEDATE);
  674.     DateTimeToPacked (TLASTDL, HDRREC.LASTDL);
  675.     RarPtr [pkChoice]^ := HDRREC;
  676.   END;
  677. END;
  678.  
  679. PROCEDURE RaList.Insertline (NUM : WORD;
  680.   Ask : BOOLEAN);
  681. VAR
  682.   i, j : INTEGER;
  683.   m   : TPoPMenu;
  684.   ec,
  685.   key : WORD;
  686.   Redraw : BOOLEAN;
  687. BEGIN
  688.   IF Ralines + 1 > MAXLINES THEN
  689.   BEGIN
  690.     AskError (8, 'Insufficient memory to insert line', 3);
  691.     EXIT;
  692.   END;
  693.   key := 1;
  694.   IF (Ralines > 0) AND Ask THEN
  695.   BEGIN
  696.     GetMenu (MnuAMInsertLine, 3, m);
  697.     m.ProcessMenu (key, ec);
  698.   END ELSE
  699.     ec := ccNone;
  700.   IF ec <> ccQuit THEN
  701.   BEGIN
  702.     j := 0;
  703.     IF Ralines < MAXLINES THEN
  704.     BEGIN
  705.       INC (Ralines);
  706.       New(RarPtr[Ralines]);
  707.       IF Ralines > 1 THEN
  708.       BEGIN
  709.         IF key = 1 THEN j := 0 ELSE j := 1;
  710.         FOR i := Ralines - 1 DOWNTO NUM + j DO
  711.           RarPtr [i + 1]^ := RarPtr [i]^;
  712.       END;
  713.     END;
  714.     FILLCHAR (RarPtr [NUM + j]^, SIZEOF (FILESHDRRECORD), #0);
  715.     RarPtr [NUM + j]^.LONGDESCPTR := - 1;
  716.     ChangeNumItems (Ralines);
  717.   END;
  718. END;
  719.  
  720. CONST
  721.   DeleteALL : BOOLEAN = FALSE;
  722.  
  723. PROCEDURE RaList.DeleteOneLine (Ask, Del : BOOLEAN;
  724.   NUM : WORD);
  725. VAR
  726.   sr : SEARCHREC;
  727.   D : BOOLEAN;
  728.   i : WORD;
  729.   TempNAME : S12;
  730.   Redraw : BOOLEAN;
  731. BEGIN
  732.   D := Del;
  733.   WITH RarPtr [NUM]^ DO
  734.        BEGIN
  735.          IF (NAME <> '') AND (WritableFile (addbackslash (Area^ [CurrentArea]^.path^) + NAME) ) AND
  736.            ExistFile (Area^ [CurrentArea]^.path^ + NAME) THEN
  737.            BEGIN
  738.              IF DeleteALL THEN
  739.                D := TRUE ELSE
  740.                 IF Ask THEN
  741.                   BEGIN
  742.                     CASE ConfirmAll (' Delete ' + NAME + ' also?', 6) OF
  743.                          'Y' : D := TRUE;
  744.                          'N' : D := FALSE;
  745.                          'A' : BEGIN
  746.                            DeleteALL := TRUE;
  747.                            D := TRUE;
  748.                          END;
  749.                     END;
  750.                 IF D THEN
  751.                   BEGIN
  752.                     FINDFIRST (NAME, AnyFile, sr);
  753.                     WHILE DOSERROR = 0 DO
  754.                     BEGIN
  755.                       DeleteFile(sr.NAME);
  756.                       FINDNEXT(sr);
  757.                     END;
  758.                     FindClose(sr);
  759.                   END;
  760.              END;
  761.          END;
  762.  
  763.        FOR i := NUM TO Ralines - 1 DO
  764.            RarPtr [i]^ := RarPtr [i + 1]^;
  765.        Dispose(RarPtr[Ralines]);
  766.   END;
  767.   DEC (Ralines);
  768.   ChangeNumItems (Ralines);
  769.   {Move the highlight bar if forced to}
  770.   IF pkChoice > Ralines THEN
  771.     BEGIN
  772.       pkChoice := Ralines;
  773.       IF Ralines > 0 THEN
  774.         SetInitialChoice (pkChoice);
  775.     END;
  776. END;
  777.  
  778. PROCEDURE RaList.Deleteline (Ask : BOOLEAN);
  779. VAR
  780.   Del : BOOLEAN;
  781.   j : WORD;
  782.   SellectedItem : WORD;
  783. BEGIN
  784.   Del := NOT Ask;
  785.   IF Ask THEN
  786.     IF RaSelected = 0 THEN
  787.       Del := Confirm ('Delete current line', 'Y', 5)
  788.     ELSE
  789.        Del := Confirm ('Delete MARKED lines', 'N', 5);
  790.   DeleteALL := FALSE;
  791.   IF Del THEN
  792.     BEGIN
  793.       IF RaSelected > 0 THEN
  794.         BEGIN
  795.           j := 1;
  796.           REPEAT
  797.             IF BOOLEAN (RarPtr [j]^.FREESPACE [20]) THEN
  798.               BEGIN
  799.                 IF Ralines > 0 THEN
  800.                   DeleteOneLine (Ask, Del, j)
  801.               END
  802.             ELSE
  803.                INC (j);
  804.           UNTIL j > Ralines;
  805.           RaClearSelected;
  806.         END
  807.       ELSE
  808.          IF Ralines > 0 THEN
  809.            DeleteOneLine (Ask, Del, pkChoice);
  810.     END;
  811. END;
  812.  
  813. PROCEDURE RaList.TouchFile;
  814. VAR
  815.   l      : LONGINT;
  816.   dofw, Sec100 : WORD;
  817.   Dt     : DateTime;
  818.   F      : FILE;
  819.   SellectedItem    : WORD;
  820.  
  821. BEGIN
  822.   WITH Dt DO
  823.        BEGIN
  824.          GETTIME (Hour, Min, Sec, Sec100);
  825.          GETDATE (Year, Month, Day, dofw);
  826.        END;
  827.   PACKTIME (Dt, l);
  828.   IF RaSelected = 0 THEN
  829.     BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]) := TRUE;
  830.   FOR SellectedItem := 1 TO Ralines DO
  831.       BEGIN
  832.         IF (BOOLEAN (RarPtr [SellectedItem]^.FREESPACE [20]) ) AND (RarPtr [SellectedItem]^.NAME <> '') THEN
  833.           BEGIN
  834.             ASSIGN (F, RarPtr [SellectedItem]^.NAME);
  835.             FileMode := ShareRead + ShareDenyW;
  836.             RESET (F);
  837.             IF IORESULT = 0 THEN
  838.               BEGIN
  839.                 RarPtr [SellectedItem]^.FILEDATE := l;
  840.                 SETFTIME (F, l);
  841.                 CLOSE (F);
  842.               END;
  843.           END;
  844.       END;
  845.   RaClearSelected;
  846. END;
  847.  
  848.  
  849. PROCEDURE RaList.MoveFileInSameArea;
  850. VAR
  851.   TEMPREC : FILESHDRRECORD;
  852.   i,
  853.   TTO,
  854.   From,
  855.   key : WORD;
  856.  
  857. BEGIN
  858.   Information('MOVE MODE: F-Keys disabled. Hit RETURN to finish.');
  859.   From := pkChoice;
  860.   REPEAT
  861.     Process;
  862.     key := GETLASTKEY;
  863.     CASE GETLASTKEY OF
  864.          Enter : BEGIN
  865.            TEMPREC := RarPtr [From]^;
  866.            TTO := pkChoice;
  867.            DeleteOneLine (FALSE, FALSE, From);
  868.            Insertline (TTO, FALSE);
  869.            RarPtr [TTO]^ := TEMPREC;
  870.          END;
  871.     END;
  872.   UNTIL (key = Enter) OR (key = Esc);
  873.   Information ('');
  874. END;
  875.  
  876. PROCEDURE RaList.Moveline;
  877. VAR
  878.   m : TPoPMenu;
  879.   sd : CHAR;
  880.   key : INTEGER;
  881.  
  882. PROCEDURE MoveFileToOtherArea (KEEP, InFileArea : BOOLEAN);
  883. LABEL
  884.   Slut, Skip, DoTheMove, MoveTheText;
  885. VAR
  886.   Go, All        : BOOLEAN;
  887.   OldAreaLine,
  888.   OldTopArea, j  : WORD;
  889.   GemTekst, Fp,
  890.   s, ss, DestPath : STRING;
  891.   Othertxtfile   : TbufTextfile;
  892.   OtherHDRFILE,
  893.   OtherIDXFILE   : TNetFile;
  894.   Escaped        : BOOLEAN;
  895.   m              : TPoPMenu;
  896.   OldArea,
  897.   key, Inkey     : WORD;
  898.  
  899. PROCEDURE MoveAll_Info_on_file;
  900. VAR
  901.   C : CHAR;
  902.   FZ : LONGINT;
  903.   IDXREC : FILESIDXRECORD;
  904. BEGIN
  905.   IF InFileArea THEN
  906.     BEGIN
  907.       RarPtr [j]^.FREESPACE [20] := 0;
  908.       HDRREC := RarPtr [j]^;
  909.       IF HDRREC.LONGDESCPTR > - 1 THEN
  910.         BEGIN
  911.           HDRREC.LONGDESCPTR := Othertxtfile.getsize;
  912.           RaTEXTFILE.SEEK (RarPtr [j]^.LONGDESCPTR);
  913.           IF HDRREC.LONGDESCPTR > 0 THEN
  914.             BEGIN
  915.               Othertxtfile.SEEK (HDRREC.LONGDESCPTR - 1);
  916.               Othertxtfile.WriteNoln (#0);
  917.             END;
  918.           RaTEXTFILE.READ (C, 1);
  919.           WHILE NOT RaTEXTFILE.EOF AND NOT (C = #0) DO
  920.                 BEGIN
  921.                   Othertxtfile.WRITE (C, 1);
  922.                   RaTEXTFILE.READ (C, 1);
  923.                 END;
  924.           Othertxtfile.WriteNoln (#0);
  925.         END;
  926.       OtherHDRFILE.SEEK(OtherHDRFILE.FILESIZE);
  927.       OtherHDRFILE.Write(HDRREC);
  928.  
  929.       OtherIDXFILE.SEEK(OtherIDXFILE.FILESIZE);
  930.       FILLCHAR (IDXREC, SIZEOF (FILESIDXRECORD), #0);
  931.       IDXREC.NAME := HDRREC.NAME;
  932.       IDXREC.UPLOADDATE := HDRREC.UPLOADDATE;
  933.       IDXREC.LONGDESCPTR := HDRREC.LONGDESCPTR;
  934.       OtherIDXFILE.Write(IDXREC);
  935.     END;
  936.   IF NOT KEEP THEN
  937.     DeleteOneLine (FALSE, FALSE, j);
  938. END;
  939.  
  940. BEGIN
  941.   j := 1;
  942.   OldArea := CurrentArea;
  943.   OldTopArea := TopArea;
  944.   OldAreaLine := AreaLine;
  945.   IF InFileArea THEN
  946.     BEGIN
  947.       Escaped := NOT ChooseFileArea (Inkey);
  948.       DestPath := Area^ [CurrentArea]^.path^;
  949.       AreaLine := OldAreaLine;
  950.       TopArea := OldTopArea;
  951.       ChangeDir (Area^ [OldArea]^.path^);
  952.       IF Escaped THEN
  953.         GOTO Slut;
  954.     END ELSE
  955.      BEGIN
  956.        DestPath := 'A:';
  957.        IF NOT SelectPath (DestPath) THEN
  958.          GOTO Slut;
  959.      END;
  960.   IF ( (CurrentArea <> OldArea) OR NOT InFileArea) THEN
  961.     BEGIN {5}
  962.       IF RaSelected = 0 THEN
  963.         BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]) := TRUE;
  964.       IF InFileArea THEN
  965.         BEGIN
  966.           Othertxtfile.initCreate (FDBPATH + 'TXT\fdb' + Long2str (CurrentArea) + '.TXT',
  967.           SOpenWrite, 2048);
  968.           OtherHDRFILE.Open(FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR', SIZEOF (HDRREC),
  969.           NOT ExistFile (FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR') );
  970.           OtherIDXFILE.Open(FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX', SIZEOF (FILESIDXRECORD),
  971.           NOT ExistFile (FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX') );
  972.         END;
  973.       All := FALSE;
  974.       Go := TRUE;
  975.       j := 1;
  976.       REPEAT
  977.         IF BOOLEAN (RarPtr [j]^.FREESPACE [20]) THEN
  978.           BEGIN {3}
  979.             s := RarPtr [j]^.NAME;
  980.             { S er et filnavn og filen findes i det nye område }
  981.             IF (s <> '') AND (ExistFile (addbackslash (DestPath) + s) )
  982.               AND (ExistFile (Area^ [OldArea]^.path^ + s) ) THEN
  983.               BEGIN {1}
  984.                 IF NOT All THEN
  985.                   BEGIN {2}
  986.                     CASE ConfirmAll ('Overwrite existing file "' + s + '" ?', 8) OF
  987.                          'Y' : Go := TRUE;
  988.                          'N' : Go := FALSE;
  989.                          'A' : BEGIN
  990.                            Go := TRUE;
  991.                            All := TRUE;
  992.                          END;
  993.                     END;
  994.                 END; {2}
  995.             END; {1}
  996.           IF (s <> '') AND (Go) AND (ExistFile (Area^ [OldArea]^.path^ + s) ) THEN
  997.             BEGIN  {4}
  998.               DoTheMove :
  999.               {IF (COPY (Area^ [OldArea]^.path^, 1, 1) = COPY (DestPath, 1, 1) ) THEN
  1000.                     DeleteFile (addbackslash (DestPath) + s);}
  1001.               io := CopyFile (Area^ [OldArea]^.path^ + s, addbackslash (DestPath) + s, FALSE, NOT KEEP);
  1002.               IF io <> 0 THEN
  1003.                 BEGIN
  1004.                   CASE io OF
  1005.                        5 : ss := 'No Room for ' + JustFileName (s);
  1006.                        152 : ss := 'Drive not ready';
  1007.                        162 : ss := 'General failure';
  1008.                   ELSE
  1009.                        ss := 'Unknown error #' + Long2str (io);
  1010.                 END;
  1011.               GetMenu (MnuCopyFileError, 3, m);
  1012.               m.wFrame.AddHeader (' ' + ss + ' ', heTC);
  1013.               m.Draw;
  1014.               m.Process;
  1015.               key := m.MenuChoice;
  1016.               IF m.GetLastCommand = ccQuit THEN
  1017.                 key := 2;
  1018.               m.Done;
  1019.               CASE key OF
  1020.                    1 : GOTO DoTheMove;
  1021.                    2 : GOTO Slut;
  1022.                    3 : GOTO Skip;
  1023.               END;
  1024.           END; {4}
  1025.         END; {5}
  1026.         MoveAll_Info_on_file;
  1027.         Skip :
  1028.         IF KEEP OR (io = 5) THEN
  1029.           INC (j);
  1030.       END
  1031.       ELSE
  1032.          INC (j);
  1033.     UNTIL j > Ralines;
  1034.     Slut :
  1035.     IF InFileArea THEN
  1036.       BEGIN
  1037.         CurrentArea := OldArea;
  1038.         Othertxtfile.Done;
  1039.         OtherHDRFILE.Close;
  1040.         OtherIDXFILE.Close;
  1041.       END;
  1042.   END;
  1043. RaClearSelected;
  1044. END;
  1045.  
  1046. BEGIN
  1047.   GetMenu (MnuAMMoveFile, 3, m);
  1048.   IF GetDiskClass (Area^ [CurrentArea]^.path^ [1], sd) = CDRomDisk THEN
  1049.     BEGIN
  1050.       m.ProtectItem (1);
  1051.       m.ProtectItem (2);
  1052.     END;
  1053.   IF (RaSelected > 1) OR
  1054.     (GetDiskClass (Area^ [CurrentArea]^.path^ [1], sd) = CDRomDisk) THEN
  1055.     m.ProtectItem (5);
  1056.   m.Draw;
  1057.   m.Process;
  1058.   key := m.MenuChoice;
  1059.   m.ERASE;
  1060.   IF m.GetLastCommand <> ccQuit THEN
  1061.     BEGIN
  1062.       CASE key OF
  1063.            1..4 : MoveFileToOtherArea (key IN [3, 4], key IN [1, 3]);
  1064.            5   : MoveFileInSameArea;
  1065.       END;
  1066.   END;
  1067.   m.Done;
  1068. END;
  1069.  
  1070. PROCEDURE RaList.RaQuickSort (First, Last : WORD);
  1071. VAR
  1072.   i, j : WORD;
  1073.   x : S12;
  1074.   Y : POINTER;
  1075. BEGIN
  1076.   i := First;
  1077.   j := Last;
  1078.   x := RarPtr [ (First + Last) DIV 2]^.NAME;
  1079.   REPEAT
  1080.     WHILE RarPtr [i]^.NAME < x DO
  1081.           i := i + 1;
  1082.     WHILE x < RarPtr [j]^.NAME DO
  1083.           j := j - 1;
  1084.     IF i <= j THEN
  1085.       BEGIN
  1086.         Y := RarPtr [i];
  1087.         RarPtr [i] := RarPtr [j];
  1088.         RarPtr [j] := Y;
  1089.         INC (i);
  1090.         DEC (j);
  1091.       END;
  1092.   UNTIL i > j;
  1093.   IF First < j THEN
  1094.     RaQuickSort (First, j);
  1095.   IF i < Last THEN
  1096.     RaQuickSort (i, Last);
  1097. END;
  1098.  
  1099. PROCEDURE RaList.RaSortFiles;
  1100. VAR
  1101.   ALo, AHI : WORD;
  1102.   NUM,
  1103.   First, Last,
  1104.   i, j        : WORD;
  1105.   s, LastUsed, Smallest : S13;
  1106.  
  1107. BEGIN {quicksort}
  1108.   IF RaSelected = 2 THEN
  1109.     BEGIN
  1110.       First := 1;
  1111.       WHILE NOT BOOLEAN (RarPtr [First]^.FREESPACE [20]) DO
  1112.             INC (First);
  1113.       IF RarPtr [First]^.NAME = '' THEN
  1114.         BEGIN
  1115.           AskError (8, 'First line MUST contain a file name', 3);
  1116.           EXIT;
  1117.         END;
  1118.       Last  := First + 1;
  1119.       WHILE NOT BOOLEAN (RarPtr [Last]^.FREESPACE [20]) DO
  1120.             INC (Last);
  1121.       j := First;
  1122.       WHILE (j <= Last) DO
  1123.             BEGIN
  1124.               WHILE (j <= Last) AND (RarPtr [j]^.NAME <> '') DO
  1125.                     INC (j);
  1126.               RaQuickSort (First, j - 1);
  1127.               INC (j);
  1128.               WHILE (j <= Last) AND (RarPtr [j]^.NAME = '') DO
  1129.                     INC (j);
  1130.               First := j;
  1131.             END;
  1132.       RaClearSelected;
  1133.     END;
  1134. END;
  1135.  
  1136. VAR
  1137.   SelectedHdrIndex : BYTE;
  1138.  
  1139.   FUNCTION RaList.RaLoadfiles : BOOLEAN;
  1140.   VAR
  1141.     HDRFILE       : TNetFile;
  1142.     Redraw        : BOOLEAN;
  1143.     WaitWin       : PWait;
  1144.     Tempstr       : STRING;
  1145.     C             : CHAR;
  1146.     T,
  1147.     TXTBUF        : LONGINT;
  1148.   BEGIN
  1149.     New(WaitWin, Init(5, 3, 'Scanning for files'));
  1150.     { ******************* ......... *** Rettes til en var }
  1151.     HDRFILE.Open(FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR', SIZEOF (HDRREC),
  1152.                  NOT ExistFile (FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR') );
  1153.     T := MAXAVAIL - (HDRFILE.FILESIZE * 194);
  1154.     IF T > $FFFF THEN
  1155.       TXTBUF := 20 * 1024
  1156.     ELSE
  1157.     BEGIN
  1158.       TXTBUF := T - 10 * 1024;
  1159.       IF TXTBUF < 0 THEN TXTBUF := 1024;
  1160.     END;
  1161.     RaTEXTFILE.initCreate ( FDBPATH + 'TXT\fdb' + Long2str (CurrentArea) + '.TXT', Sopen, TXTBUF);
  1162.  
  1163.     Rafiles := 0;
  1164.     RaSelected := 0;
  1165.     RaSelSize := 0;
  1166.     Ralines := 0;
  1167.     Rasize  := 0;
  1168.     RaLoadfiles := TRUE;
  1169.     WHILE NOT HDRFILE.EOF AND (Ralines <= MAXLINES) AND (MAXAVAIL > 10240) DO
  1170.     BEGIN
  1171.       HDRFILE.Read(HDRREC, NoKeep, Wait);
  1172.       INC (Ralines);
  1173.       New(RarPtr [Ralines]);
  1174.       IF RarPtr[Ralines]=NIL THEN
  1175.       BEGIN
  1176.         RaLoadfiles := FALSE;
  1177.         Break;
  1178.       END;
  1179.       RarPtr [Ralines]^ := HDRREC;
  1180.       BOOLEAN (RarPtr [Ralines]^.FREESPACE [20]) := FALSE;
  1181.       IF (HDRREC.NAME <> '') THEN
  1182.       BEGIN
  1183.         IF NOT ExistFile (addbackslash (Area^ [CurrentArea]^.path^) + HDRREC.NAME) THEN
  1184.           RarPtr [Ralines]^ .FREESPACE [1] := 1
  1185.         ELSE
  1186.         BEGIN
  1187.           Rasize := Rasize + HDRREC.SIZE;
  1188.           INC (Rafiles);
  1189.           {ClearByteFlag (RarPtr [Ralines]^ .Attrib, RaMISSING)}
  1190.         END;
  1191.       END ELSE
  1192.       BEGIN
  1193.         ReadDescLine (Tempstr, HDRREC.LONGDESCPTR);
  1194.         Tempstr := PAD (Tempstr, 80);
  1195.         MOVE (Tempstr [1], RarPtr [Ralines]^.SIZE, 80);
  1196.       END;
  1197.       WaitWin^.Animate;
  1198.     END;
  1199.     HDRFILE.Close;
  1200.     Dispose(WaitWin, Done);
  1201.     IF Ralines > MAXLINES THEN
  1202.     BEGIN
  1203.       RaLoadfiles := FALSE;
  1204.       RaTEXTFILE.Done;
  1205.     END ELSE
  1206.       ChangeNumItems (Ralines);
  1207.     IF Cfg.Areaman.AdoptDefault AND NOT AdoptOrphans(TRUE, FALSE) THEN RaLoadfiles := FALSE;
  1208.     TotalHeader;
  1209.   END;
  1210.  
  1211.   PROCEDURE RaList.RaWritefiles;
  1212.   VAR
  1213.     IDXFILE  : TNetFile;
  1214.     HDRFILE  : FILE;
  1215.     TIDXFILE : TNetFile;
  1216.     THDRFILE : TNetFile;
  1217.     WaitWin  : PWait;
  1218.     IDXREC   : FILESIDXRECORD;
  1219.     A        : INTEGER;
  1220.     RAERASEFILES : BOOLEAN;
  1221.     HS, IS : STRING;
  1222.   BEGIN
  1223.     New(WaitWin, Init(5, 3, 'Savning files'));
  1224.     HS := UniqueName (FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR');
  1225.     THDRFILE.Open(HS, SIZEOF (HDRREC), TRUE);
  1226.     IS := UniqueName (FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX');
  1227.     TIDXFILE.Open(IS, SIZEOF (HDRREC), TRUE);
  1228.  
  1229.     IDXFILE.Open(FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX', SIZEOF (IDXREC),
  1230.                  NOT ExistFile (FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX') );
  1231.     FOR A := 1 TO Ralines DO
  1232.     BEGIN
  1233.       RarPtr [Ralines]^ .FREESPACE [1] := 0;
  1234.       RarPtr [Ralines]^.FREESPACE [20] := 0;
  1235.       THDRFILE.PutRec(RarPtr [A]^, A - 1);
  1236.       IDXREC.NAME := RarPtr [A]^.NAME;
  1237.       IDXREC.UPLOADDATE := RarPtr [A]^.UPLOADDATE;
  1238.       IDXREC.LONGDESCPTR := RarPtr [A]^.LONGDESCPTR;
  1239.       TIDXFILE.PutRec(IDXREC, A - 1);
  1240.       Dispose(RarPtr[A]);
  1241.       WaitWin^.Animate;
  1242.     END;
  1243.     RAERASEFILES := TIDXFILE.FILESIZE= 0;
  1244.     IDXFILE.Close;
  1245.     TIDXFILE.Close;
  1246.     THDRFILE.Close;
  1247.     RaTEXTFILE.Done;
  1248.     IF RAERASEFILES THEN
  1249.     BEGIN
  1250.       DeleteFile (FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR');
  1251.       DeleteFile (FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX');
  1252.       DeleteFile (FDBPATH + 'TXT\fdb' + Long2str (CurrentArea) + '.TXT');
  1253.       DeleteFile (HS);
  1254.       DeleteFile (IS);
  1255.     END ELSE
  1256.     BEGIN
  1257.       DeleteFile (FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR');
  1258.       DeleteFile (FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX');
  1259.       RenameFile (HS, FDBPATH + 'HDR\fdb' + Long2str (CurrentArea) + '.HDR');
  1260.       RenameFile (IS, FDBPATH + 'IDX\fdb' + Long2str (CurrentArea) + '.IDX');
  1261.     END;
  1262.     Dispose(WaitWin, Done);
  1263.     RaClearSelected;
  1264.     Clear;
  1265.   END;
  1266.  
  1267.   PROCEDURE RaList.RaDelocatefiles;
  1268.   VAR
  1269.     A : INTEGER;
  1270.  
  1271.   BEGIN
  1272.     FOR A := 1 TO Ralines DO
  1273.         Dispose(RarPtr[A]);
  1274.     RaClearSelected;
  1275.     Clear;
  1276.     RaTEXTFILE.Done;
  1277.   END;
  1278.  
  1279.  
  1280.   PROCEDURE RaList.RenameLine;
  1281.   VAR
  1282.     s, ss    : S13;
  1283.   BEGIN
  1284.     s := RarPtr [pkChoice]^.NAME;
  1285.     IF s <> ''THEN
  1286.       BEGIN
  1287.         IF InputString (30, 8, 12, 12, 3, 'Rename file', 'FileName : ', s)
  1288.           AND (s <> RarPtr [pkChoice]^.NAME) THEN
  1289.           BEGIN
  1290.             s := StUpCase (s);
  1291.             IF RenameFile (RarPtr [pkChoice]^.NAME, s) THEN
  1292.               RarPtr [pkChoice]^.NAME := s;
  1293.           END;
  1294.     end;
  1295.   END;
  1296.  
  1297.   PROCEDURE RaList.TouchAllFiles;
  1298.   VAR
  1299.     F      : FILE;
  1300.     i      : INTEGER;
  1301.     l      : LONGINT;
  1302.     Dt     : DateTime;
  1303.     Sec100,
  1304.     dofw   : WORD;
  1305.   BEGIN
  1306.     IF Confirm ('Touch ALL files >', 'Y', 5) THEN
  1307.       BEGIN
  1308.         WITH Dt DO
  1309.              BEGIN
  1310.                GETTIME (Hour, Min, Sec, Sec100);
  1311.                GETDATE (Year, Month, Day, dofw);
  1312.              END;
  1313.         PACKTIME (Dt, l);
  1314.         FOR i := 1 TO Ralines DO
  1315.             BEGIN
  1316.               RarPtr [i]^.FILEDATE := l;
  1317.               ASSIGN (F, RarPtr [i]^.NAME);
  1318.               FileMode := ShareRead + ShareDenyW;
  1319.               RESET (F);
  1320.               SETFTIME (F, l);
  1321.               CLOSE (F);
  1322.             END;
  1323.       END;
  1324.   END;
  1325.  
  1326.   FUNCTION RaList.AdoptOrphans (Silent, EnterUploader : BOOLEAN) : BOOLEAN;
  1327.   VAR
  1328.     inf : WORD;
  1329.     i, NUM : INTEGER;
  1330.     DirInfo : SEARCHREC;
  1331.     s : STRING [35];
  1332.   BEGIN
  1333.     AdoptOrphans := TRUE;
  1334.     IF Silent OR Confirm ('Adopt ALL orphans in this area >', 'Y', 9) THEN
  1335.     BEGIN
  1336.       s := Cfg.Sysop;
  1337.       IF EnterUploader THEN InputString (5, 8, 35, 50, 3, 'Uploader', 'Name : ', s);
  1338.       inf := Ralines;
  1339.       NUM := 0;
  1340.       FINDFIRST ('*.*', Archive, DirInfo);
  1341.       WHILE DOSERROR = 0 DO
  1342.       BEGIN
  1343.         i := 1;
  1344.         WHILE NOT (RarPtr [i]^.NAME = DirInfo.NAME) AND (i <= Ralines) DO
  1345.           INC (i);
  1346.         IF RarPtr [i]^.NAME <> DirInfo.NAME THEN
  1347.         BEGIN
  1348.           IF i <= Ralines THEN INC (i);
  1349.           INC (Ralines);
  1350.           INC (Rafiles);
  1351.           New(RarPtr[Ralines]);
  1352.           IF (MAXLINES < Ralines) OR
  1353.              (MAXAVAIL < 10240) OR
  1354.              (RarPtr[Ralines]=NIL) THEN
  1355.           BEGIN
  1356.             AdoptOrphans := FALSE;
  1357.             DEC (Ralines);
  1358.             DEC (Rafiles);
  1359.             ChangeNumItems (Ralines);
  1360.             EXIT;
  1361.           END;
  1362.           INC (NUM);
  1363.           FILLCHAR (RarPtr [Ralines]^, SIZEOF (FILESHDRRECORD), #0);
  1364.           WITH DirInfo DO
  1365.           BEGIN
  1366.             RarPtr [Ralines]^.NAME := NAME;
  1367.             RarPtr [Ralines]^.SIZE := SIZE;
  1368.             RarPtr [Ralines]^.FILEDATE := time;
  1369.             RarPtr [Ralines]^.UPLOADDATE := time;
  1370.           END;
  1371.           RarPtr [Ralines]^.UPLOADER := s;
  1372.           RarPtr [Ralines]^.LONGDESCPTR := - 1;
  1373.         END;
  1374.         FINDNEXT (DirInfo);
  1375.       END;
  1376.       FindClose(DirInfo);
  1377.       ChangeNumItems (Ralines);
  1378.       IF inf = 0 THEN INC (inf);
  1379.       IF Ralines > 0 THEN RaQuickSort (inf, Ralines);
  1380.       IF NOT Silent THEN UserInformation (8, Long2str (NUM) + ' file(s) adopted', 3, 1);
  1381.       TotalHeader;
  1382.     END;
  1383.   END;
  1384.  
  1385.   PROCEDURE RaList.ResetDownloadCounters;
  1386.   VAR
  1387.     i : WORD;
  1388.   BEGIN
  1389.     IF Confirm ('Reset ALL download counters in this area', 'N', 8) THEN
  1390.       FOR i := 1 TO Ralines DO
  1391.           RarPtr [i]^.TIMESDL := 0;
  1392.   END;
  1393.  
  1394.   PROCEDURE RaList.GlobalCommands;
  1395.   VAR
  1396.     m       : TPoPMenu;
  1397.     key,
  1398.     LastCmd : WORD;
  1399.   BEGIN
  1400.     IF NOT WritableFile (Area^ [CurrentArea]^.path^) AND
  1401.       NOT WritableFile (Area^ [CurrentArea]^.FPath^) THEN
  1402.       EXIT;
  1403.     GetMenu (MnuAMGlobalFunc, 3, m);
  1404.     IF NOT WritableFile (Area^ [CurrentArea]^.FPath^) THEN
  1405.       BEGIN
  1406.         FOR LastCmd := 1 TO 6 DO
  1407.             IF NOT (LastCmd <> 2) THEN
  1408.               m.ProtectItem (LastCmd);
  1409.       END;
  1410.     IF NOT WritableFile (Area^ [CurrentArea]^.path^) THEN
  1411.       m.ProtectItem (2);
  1412.     m.ProtectItem (3);
  1413.     m.ProtectItem (5);
  1414.     m.ProtectItem (6);
  1415.     m.ProcessMenu (key, LastCmd);
  1416.     IF LastCmd <> ccQuit THEN
  1417.       BEGIN
  1418.         CASE key OF
  1419.              1 : AdoptOrphans (FALSE, TRUE);
  1420.              2 : TouchAllFiles;
  1421.              {       3 : DeleteDownloadCounters;}
  1422.              4 : ResetDownloadCounters;
  1423.              {       5 : InsertDownLoadCounters(FALSE);
  1424.           6 : ReAllignDownloadCounters(FALSE);}
  1425.         END;
  1426.     END;
  1427.   END;
  1428.   PROCEDURE RaList.SendFilesToNode;
  1429.   VAR
  1430.     ch : CHAR;
  1431.     m : BYTE;
  1432.     Escaped : BOOLEAN;
  1433.     i : WORD;
  1434.     SendAddress : TFidoAddress;
  1435.     s : STRING;
  1436.   BEGIN
  1437.     FILLCHAR (SendAddress, SIZEOF (SendAddress), 0);
  1438.     IF RaSelected = 0 THEN
  1439.       BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]) := TRUE;
  1440.     NodeListPathStr := #255;
  1441.     InitialiseNodeList (Cfg.NodeList, Cfg.NodeListTyp);
  1442.     IF GetConfirmAddress (3, 4, SendAddress, 1503) THEN
  1443.       BEGIN
  1444.         m := SelectMailType (Escaped, 1550);
  1445.         IF NOT Escaped THEN
  1446.           BEGIN
  1447.             ExtFlags [1] := 'H';
  1448.             ExtFlags [3] := 'F';
  1449.             ch := ExtFlags [m];
  1450.             FOR i := 1 TO Ralines DO
  1451.                 IF (BOOLEAN (RarPtr [i]^.FREESPACE [20]) ) AND (RarPtr [i]^.NAME <> '') THEN
  1452.                   SendAFile (Area^ [CurrentArea]^.path^ + RarPtr [i]^.NAME, SendAddress, ch, STNothing);
  1453.           END;
  1454.       END;
  1455.     FreeUpMemory;
  1456.   END;
  1457.  
  1458.   PROCEDURE RaList.HatchFiles;
  1459.   VAR
  1460.     i : WORD;
  1461.   BEGIN
  1462.     FOR i := 1 TO Ralines DO
  1463.         IF (BOOLEAN (RarPtr [i]^.FREESPACE [20]) ) AND
  1464.           (RarPtr [i]^.NAME <> '') THEN
  1465.           Hatch (Area^ [CurrentArea]^.path^ + RarPtr [i]^.NAME, '');
  1466.   END;
  1467.  
  1468.   PROCEDURE RaList.Centerline;
  1469.   VAR
  1470.     A : BYTE;
  1471.     C : CHAR;
  1472.     ss : STRING;
  1473.   BEGIN
  1474.     ReadLnFromMem (ss, pkChoice);
  1475.     ss := Trimtrail (Center (TRIM (ss), 79) );
  1476.     IF ss <> '' THEN
  1477.       BEGIN
  1478.         RarPtr [pkChoice]^.LONGDESCPTR := RaTEXTFILE.getsize;
  1479.         IF RarPtr [pkChoice]^.LONGDESCPTR > 0 THEN
  1480.           BEGIN
  1481.             RaTEXTFILE.SEEK (RarPtr [pkChoice]^.LONGDESCPTR - 1);
  1482.             RaTEXTFILE.WriteNoln (#0);
  1483.           END
  1484.         ELSE
  1485.            RaTEXTFILE.SEEK (0);
  1486.         RaTEXTFILE.WriteNoln (ss + #0);
  1487.       END
  1488.     ELSE
  1489.        RarPtr [pkChoice]^.LONGDESCPTR := - 1;
  1490.     Writeln2Mem (ss, pkChoice);
  1491.   END;
  1492.  
  1493.   PROCEDURE RaList.Joinlines;
  1494.   VAR
  1495.     C : CHAR;
  1496.     Dss,
  1497.     Dss2 : STRING;
  1498.   BEGIN
  1499.     ReadLnFromMem (Dss, pkChoice);
  1500.     ReadLnFromMem (Dss2, pkChoice + 1);
  1501.     { skriv den sammenlagte description og fjern den anden}
  1502.     IF LENGTH (Dss) + LENGTH (Dss2) < 79 THEN
  1503.       BEGIN
  1504.         Dss := Dss + Dss2;
  1505.         RarPtr [pkChoice]^.LONGDESCPTR := RaTEXTFILE.getsize;
  1506.         IF RarPtr [pkChoice]^.LONGDESCPTR > 0 THEN
  1507.           BEGIN
  1508.             RaTEXTFILE.SEEK (RarPtr [pkChoice]^.LONGDESCPTR - 1);
  1509.             RaTEXTFILE.WriteNoln (#0);
  1510.           END
  1511.         ELSE
  1512.            RaTEXTFILE.SEEK (0);
  1513.         RaTEXTFILE.WriteNoln (Dss + #0);
  1514.         Writeln2Mem (Dss, pkChoice);
  1515.         DeleteOneLine (FALSE, FALSE, pkChoice + 1);
  1516.       END;
  1517.   END;
  1518.  
  1519.  
  1520.   PROCEDURE RaList.ViewGIF;
  1521.   VAR
  1522.     s         : S13;
  1523.     ss        : STRING;
  1524.   BEGIN
  1525.     s := RarPtr [pkChoice]^.NAME;
  1526.     IF (s <> '') AND (TrimSpaces (Cfg.Areaman.ViewCMD) <> '') THEN
  1527.       BEGIN
  1528.         ss := Cfg.Areaman.ViewCMD;
  1529.         Replace (ss, '$filename', s, 0);
  1530.         RunCmd (ss, '');
  1531.       END;
  1532.   END;
  1533.  
  1534.   PROCEDURE RaList.ImportDescription;
  1535.   VAR
  1536.     s         : S13;
  1537.     ss        : STRING;
  1538.     IMPFILE   : TbufTextfile;
  1539.     C : CHAR;
  1540.     i : INTEGER;
  1541.     SellectedItem : Word;
  1542.   BEGIN
  1543.     s := 'File_id.diz';
  1544.     IF InputString (5, 8, 35, 50, 3, 'Import Description from Archive', 'FileName : ', s) THEN
  1545.       BEGIN
  1546.         IF RaSelected = 0 THEN
  1547.             BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]) := TRUE;
  1548.        FOR SellectedItem := 1 TO Ralines DO
  1549.          BEGIN
  1550.            IF (BOOLEAN (RarPtr [SellectedItem]^.FREESPACE [20]) ) AND (RarPtr [SellectedItem]^.NAME <> '') THEN
  1551.            BEGIN
  1552.             i := ArcType (RarPtr [SellectedItem]^.NAME);
  1553.             IF i > 0 THEN
  1554.             Begin
  1555.               {ss := Cfg.packer [i] .UnPackCmd;
  1556.               Replace (ss, '$filespec', s, 0);
  1557.               Replace (ss, '$archive', RarPtr [SellectedItem]^.NAME, 0);
  1558.               RunCmd (ss, '');}
  1559.               IF ArcCommand(i, 2, Fexpand(RarPtr [SellectedItem]^.NAME), s)
  1560.                  AND ExistFile (s) THEN
  1561.                 BEGIN
  1562.                   IMPFILE.Init (s, Sopen, 1024);
  1563.                   RarPtr [SellectedItem]^.LONGDESCPTR := RaTEXTFILE.getsize;
  1564.                   IF RarPtr [SellectedItem]^.LONGDESCPTR > 0 THEN
  1565.                     BEGIN
  1566.                       RaTEXTFILE.SEEK (RarPtr [SellectedItem]^.LONGDESCPTR - 1);
  1567.                       RaTEXTFILE.WriteNoln (#0);
  1568.                     END;
  1569.                   IMPFILE.READ (C, 1);
  1570.                   WHILE NOT IMPFILE.EOF DO
  1571.                         BEGIN
  1572.                           RaTEXTFILE.WRITE (C, 1);
  1573.                           IMPFILE.READ (C, 1);
  1574.                         END;
  1575.                   IMPFILE.Done;
  1576.                   DeleteFile (s);
  1577.                 END;
  1578.             END;
  1579.            END;
  1580.          END;
  1581.         RaClearSelected;
  1582.       END;
  1583.   END;
  1584.  
  1585.   Procedure Ralist.Reverse_Select;
  1586.   VAR
  1587.    I : WORD;
  1588.   Begin
  1589.     FOR I := 1 TO RALINES DO
  1590.      BOOLEAN (RarPtr [I]^.FREESPACE [20])  := NOT BOOLEAN (RarPtr [I]^.FREESPACE [20]);
  1591.   END;
  1592.  
  1593.   FUNCTION WildComp(wild,name:string):boolean;
  1594.   BEGIN
  1595.      WildComp:=FALSE;
  1596.      if name = '' then exit;
  1597.      CASE wild[1] of
  1598.         '*' : BEGIN
  1599.                 if name[1]='.' then exit;
  1600.                 if length(wild)=1 then WildComp:=TRUE;
  1601.                 if (length(wild) > 1) and (wild[2]='.') and (length(name) > 0)
  1602.                 then WildComp:=WildComp(copy(wild,3,length(wild)-2),
  1603.                      copy(name,pos('.',name)+1,length(name)-pos('.',name)));
  1604.               END;
  1605.  
  1606.          '?': BEGIN
  1607.                 if ord(wild[0])=1
  1608.                    then WildComp:=TRUE
  1609.                    else WildComp:=WildComp(copy(wild,2,length(wild)-1),
  1610.                                            copy(name,2,length(name)-1));
  1611.               END;
  1612.  
  1613.          ELSE if name[1] = wild[1]
  1614.                    then if length(wild) > 1
  1615.                         then WildComp:=WildComp(copy(wild,2,length(wild)-1),
  1616.                                                 copy(name,2,length(name)-1))
  1617.                         else if (length(name)=1)
  1618.                              and (length(wild)=1)
  1619.                              then WildComp:=TRUE
  1620.                    else WildComp:=FALSE;
  1621.      END;
  1622.   END;
  1623.  
  1624.  
  1625.   Procedure Ralist.MenuSelect(MarkLine : Boolean);
  1626.   VAR
  1627.    I : WORD;
  1628.    S : String;
  1629.   Begin
  1630.     IF MArkline THEN S := 'Select' ELSE S := 'Deselect';
  1631.     IF InputString (30, 8, 12, 12, 3, S, 'Mask : ', RaMASK) THEN
  1632.       FOR I := 1 TO RALINES DO
  1633.         IF WildComp(Stupcase(RaMASK),Stupcase(RarPtr[I]^.name)) THEN
  1634.           BOOLEAN (RarPtr [I]^.FREESPACE [20])  := MArkline;
  1635.   END;
  1636.  
  1637.   PROCEDURE RaList.TotalHeader;
  1638.   VAR
  1639.     A : WORD;
  1640.     Redraw : BOOLEAN;
  1641.   BEGIN
  1642.     Rafiles := 0;
  1643.     Rasize  := 0;
  1644.     FOR A := 1 TO Ralines DO
  1645.         BEGIN
  1646.           IF (RarPtr [A]^.NAME <> '') AND (RarPtr [A]^.FREESPACE [1] = 0) THEN
  1647.             BEGIN
  1648.               INC (Rafiles);
  1649.               INC (Rasize, RarPtr [A]^.SIZE);
  1650.             END;
  1651.         END;
  1652.     wFrame.ChangeHeaderString (1, ' Files : ' + longintform ('#####', Rafiles) +
  1653.     ' Bytes : ' + longintform ('###,###,###', Rasize) + ' ', Redraw);
  1654.  
  1655.     { **** DEBUG ***********}
  1656.     {  wFrame.ChangeHeaderString (1, ' Files : ' + longintform ('#####', Maxlines) +
  1657.     ' Bytes : ' + longintform ('###,###,###', Memavail) + ' ', Redraw); }
  1658.  
  1659.     IF Redraw THEN
  1660.       wFrame.UpDateFrame ELSE
  1661.        wFrame.DrawHeader (1);
  1662.   END;
  1663.  
  1664.   PROCEDURE RaList.SelectedHeader;
  1665.   VAR
  1666.     A : WORD;
  1667.     Redraw : BOOLEAN;
  1668.   BEGIN
  1669.     RaSelected := 0;
  1670.     RaSelSize  := 0;
  1671.     FOR A := 1 TO Ralines DO
  1672.         IF BOOLEAN (RarPtr [A]^.FREESPACE [20]) THEN
  1673.           BEGIN
  1674.             INC (RaSelected);
  1675.             IF (RarPtr [A]^.NAME <> '') AND (RarPtr [A]^.FREESPACE [1] = 0) THEN
  1676.               RaSelSize := RaSelSize + RarPtr [A]^.SIZE;
  1677.           END;
  1678.     wFrame.ChangeHeaderString (2, ' Marked lines : ' + longintform ('#####', RaSelected) +
  1679.     ' Bytes :' + longintform ('###,###,###', RaSelSize) + ' ', Redraw);
  1680.     IF Redraw THEN
  1681.       wFrame.UpDateFrame ELSE
  1682.        wFrame.DrawHeader (2);
  1683.   END;
  1684.   PROCEDURE RaList.RaClearSelected;
  1685.   VAR
  1686.     A : WORD;
  1687.   BEGIN
  1688.     FOR A := 1 TO Ralines DO
  1689.         BOOLEAN (RarPtr [A]^.FREESPACE [20]) := FALSE;
  1690.   END;
  1691.  
  1692.   {$F+}
  1693.   PROCEDURE RaList.ItemString (Item : WORD; Mode : pkMode; VAR IType : pkItemType;
  1694.                                VAR IString : STRING);
  1695.   VAR
  1696.     Dt : DateTimeRec;
  1697.     C : CHAR;
  1698.     Tempst : STRING [8];
  1699.   BEGIN
  1700.     WITH RarPtr [Item]^ DO
  1701.          BEGIN
  1702.            IF NAME <> '' THEN
  1703.              BEGIN
  1704.                PackedToDateTime (FILEDATE, Dt);
  1705.                IString := (PAD (NAME, 12) );
  1706.                IF FREESPACE [1] = 0 THEN
  1707.                  IString := IString + '  ' + longintform ('#########', SIZE) + '  ' +
  1708.                DateToDateString ('dd-mm-yy', Dt.D)
  1709.                ELSE
  1710.                   IString := IString + Center ('Missing', 21);
  1711.                IString := IString + '  [' + longintform ('@@@@@', TIMESDL) + ']';
  1712.                IString := IString + '  ' + longintform ('#####', COST);
  1713.  
  1714.                PackedToDateTime (UPLOADDATE, Dt);
  1715.                IString := IString + '  ' + DateToDateString ('dd-mm-yy', Dt.D);
  1716.                PackedToDateTime (LASTDL, Dt);
  1717.                IString := IString + '  ' + DateToDateString ('dd-mm-yy', Dt.D);
  1718.                Tempst := '-------';
  1719.                IF ByteFlagIsSet (ATTRIB, RaDELETED) THEN
  1720.                  Tempst [1] := 'D';
  1721.                IF ByteFlagIsSet (ATTRIB, RaUNLISTED) THEN
  1722.                  Tempst [2] := 'U';
  1723.                IF ByteFlagIsSet (ATTRIB, RaFREE) THEN
  1724.                  Tempst [3] := 'F';
  1725.                IF ByteFlagIsSet (ATTRIB, RaNOTAVAILABLE) THEN
  1726.                  Tempst [4] := 'N';
  1727.                IF ByteFlagIsSet (ATTRIB, RaLOCKED) THEN
  1728.                  Tempst [5] := 'L';
  1729.                IF ByteFlagIsSet (ATTRIB, RaMISSING) THEN
  1730.                  Tempst [6] := 'M';
  1731.                IF ByteFlagIsSet (ATTRIB, RaTIME) THEN
  1732.                  Tempst [7] := 'T';
  1733.                IString := IString + '  ' + Tempst;
  1734.              END
  1735.            ELSE
  1736.               BEGIN
  1737.                 IString := '';
  1738.                 IString [0] := CHAR (80);
  1739.                 MOVE (RarPtr [Item]^.SIZE, IString [1], 80);
  1740.               END;
  1741.            IF BOOLEAN (RarPtr [Item]^.FREESPACE [20]) THEN
  1742.              IType := pkalternate;
  1743.          END;
  1744.   END;
  1745.   {$F+}
  1746.  
  1747.   PROCEDURE RaList.Writedescription_To_window (LONGDESCPTR : LONGINT);
  1748.   VAR
  1749.     LINE : BYTE;
  1750.     C : CHAR;
  1751.   BEGIN
  1752.     FILLCHAR (Desclines , SIZEOF (Desclines), #0);
  1753.     LINE := 1;
  1754.     IF LONGDESCPTR > - 1 THEN
  1755.       WITH RaTEXTFILE DO
  1756.            BEGIN
  1757.              SEEK (LONGDESCPTR);
  1758.              READ (C, 1);
  1759.              WHILE (NOT EOF) AND (C <> #0) AND (LINE <= 4) DO
  1760.                    BEGIN
  1761.                      IF LENGTH (Desclines [LINE]) > 78 THEN
  1762.                        INC (LINE);
  1763.                      IF C = #13 THEN
  1764.                        BEGIN
  1765.                          READ (C, 1);
  1766.                          INC (LINE);
  1767.                        END
  1768.                      ELSE
  1769.                         Desclines [LINE] := Desclines [LINE] + C;
  1770.                      READ (C, 1);
  1771.                    END;
  1772.            END;
  1773.   END;
  1774.  
  1775.   PROCEDURE RaList.Premove;
  1776.   VAR
  1777.     LINE : BYTE;
  1778.     C : CHAR;
  1779.   BEGIN
  1780.     IF (RarPtr [pkChoice]^.NAME <> '') THEN
  1781.       BEGIN
  1782.         FILLCHAR (Desclines , SIZEOF (Desclines), #0);
  1783.         LINE := 1;
  1784.         IF RarPtr [pkChoice]^.LONGDESCPTR > - 1 THEN
  1785.           WITH RaTEXTFILE DO
  1786.                BEGIN
  1787.                  SEEK (RarPtr [pkChoice]^.LONGDESCPTR);
  1788.                  READ (C, 1);
  1789.                  WHILE (NOT EOF) AND (C <> #0) AND (LINE <= 4) DO
  1790.                        BEGIN
  1791.                          IF LENGTH (Desclines [LINE]) > 78 THEN
  1792.                            INC (LINE);
  1793.                          IF C = #13 THEN
  1794.                            BEGIN
  1795.                              READ (C, 1);
  1796.                              INC (LINE);
  1797.                            END
  1798.                          ELSE
  1799.                             Desclines [LINE] := Desclines [LINE] + C;
  1800.                          READ (C, 1);
  1801.                        END;
  1802.                END;
  1803.       END
  1804.     ELSE
  1805.        FILLCHAR (Desclines, SIZEOF (Desclines), #0);
  1806.     FOR LINE := 1 TO 4 DO
  1807.         RaDescWin^.ffasttext (PAD (Desclines [LINE], 78), LINE, 1);
  1808.   END;
  1809.  
  1810.  
  1811.   PROCEDURE RaList.AreaManagerMain;
  1812.  
  1813.   VAR
  1814.     FIN : BOOLEAN;
  1815.     Y, x : BYTE;
  1816.     Redraw  : BOOLEAN;
  1817.     Inkey : WORD;
  1818.     sr       : SEARCHREC;
  1819.   BEGIN
  1820.     {RaDescWin^.Draw;}
  1821.     Draw;
  1822.     REPEAT
  1823.       IF (ChooseFileArea (Inkey) ) AND (CurrentArea <> 0) THEN
  1824.       BEGIN
  1825.         wFrame.ChangeHeaderString (0, ' Area : ' + Area^ [CurrentArea]^.title^ + ' ', Redraw);
  1826.         IF Redraw THEN wFrame.UpDateFrame ELSE wFrame.DrawHeader (0);
  1827.         IF NOT ISDIRECTORY (JustPathName (FDBPATH) ) THEN
  1828.           AskError (8, 'Path for fdb does NOT exist', 4)
  1829.         ELSE
  1830.           IF RaLoadfiles THEN
  1831.           BEGIN
  1832.             FIN := FALSE;
  1833.             SetChoice (1, 1);
  1834.             REPEAT
  1835.               SetKbdStatProc (RaAreaManagerKbdStatProc);
  1836.               SelectedHeader;
  1837.               Process;
  1838.               SetKbdStatProc (NoKbdStatProc);
  1839.               CASE GETLASTKEY OF
  1840.                 Enter :
  1841.                   BEGIN
  1842.                     IF movemode THEN
  1843.                     BEGIN
  1844.                       movemode := FALSE;
  1845.                       Information ('');
  1846.                     END ELSE
  1847.                     BEGIN
  1848.                       BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]) := NOT BOOLEAN (RarPtr [pkChoice]^.FREESPACE [20]);
  1849.                       WhereSelect (x, Y);
  1850.                       SetChoice (GetLastChoice + 1, GetLastChoice - Y + 1);
  1851.                       SetFlag (pkSecFlags, pkRedrawOne);
  1852.                     END;
  1853.                   END;
  1854.                 Del,
  1855.                 F2 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1856.                        Deleteline (TRUE);
  1857.                 F3 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1858.                        IF RarPtr [pkChoice]^.NAME <> '' THEN
  1859.                          EditDescField
  1860.                        ELSE
  1861.                          Editdescline;
  1862.                 F4 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1863.                        Moveline;
  1864.                 F5 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1865.                        RenameLine;
  1866.                 F6 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1867.                        TouchFile;
  1868.                 INS,
  1869.                 F7 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND NOT movemode THEN
  1870.                        Insertline (pkChoice, TRUE);
  1871.                 F8 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1872.                        RaSortFiles;
  1873.                 F9 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1874.                      BEGIN
  1875.                        IF (RarPtr [pkChoice]^.NAME <> '') AND (RarPtr [pkChoice]^.FREESPACE [1] = 0)  THEN
  1876.                        BEGIN
  1877.                          ViewArchive (addbackslash (Area^ [CurrentArea]^.path^) + RarPtr [pkChoice]^.NAME,
  1878.                                       ArcType (RarPtr [pkChoice]^.NAME) );
  1879.                          Information ('');
  1880.                          FINDFIRST (RarPtr [pkChoice]^.NAME, Archive, sr);
  1881.                          FindClose(Sr);
  1882.                          RarPtr [pkChoice]^.FILEDATE := sr.time;
  1883.                          RarPtr [pkChoice]^.NAME := sr.NAME;
  1884.                          RarPtr [pkChoice]^.SIZE := sr.SIZE;
  1885.                        END;
  1886.                      END;
  1887.                 F10 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND NOT movemode THEN
  1888.                         GlobalCommands;
  1889.                 ShF1 : SendFilesToNode;
  1890.                 ShF2 : HatchFiles;
  1891.                 ShF3 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode AND
  1892.                           (RarPtr [pkChoice]^.NAME = '') THEN
  1893.                          Centerline;
  1894.                 ShF4 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 1) AND NOT movemode AND
  1895.                           (RarPtr [pkChoice]^.NAME = '') AND (RarPtr [pkChoice + 1]^.NAME = '') THEN
  1896.                          Joinlines;
  1897.                 ShF9 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode AND
  1898.                           (RarPtr [pkChoice]^.NAME <> '') AND (RarPtr [pkChoice]^.FREESPACE [1] = 0)  THEN
  1899.                          ViewGIF;
  1900.                 AltF3 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1901.                           ImportDescription;
  1902.  
  1903.                 Esc : FIN := TRUE;
  1904.                 ShF10 : IF WritableFile (Area^ [CurrentArea]^.FPath^) AND (Ralines > 0) AND NOT movemode THEN
  1905.                         BEGIN
  1906.                           IF RarPtr [pkChoice]^.NAME <> '' THEN
  1907.                             EDITATTRIBUTES
  1908.                           ELSE
  1909.                             Editdescline;
  1910.                         END;
  1911.                Star,PadStar : Reverse_Select;
  1912.                Plus,PadPlus : MenuSelect(TRUE);
  1913.                Minus, PadMinus : MenuSelect(FALSE);
  1914.              END;
  1915.              IF NOT GETLASTKEY = Enter THEN TotalHeader;
  1916.             UNTIL FIN;
  1917.             RaWritefiles;
  1918.           END ELSE
  1919.           BEGIN
  1920.             AskError (8, 'Insufficient memory to enter this area', 3);
  1921.             RaDelocatefiles;
  1922.           END;
  1923.         END;
  1924.     UNTIL Inkey = Esc;
  1925.   END;
  1926.  
  1927. END.
  1928.